package com.dayu.springbootcache.service;

import com.dayu.springbootcache.entity.Employee;
import com.dayu.springbootcache.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@CacheConfig(cacheNames="emp",cacheManager = "employeeCacheManager")//抽取缓存的公共配置
@Service
public class EmployeeService {
    @Autowired
    EmployeeMapper employeeMapper;

    /**
     * 先查询缓存如果存在则使用缓存不运行方法
     *
     * key中用spel表达式
     * cacheNames/value 指定缓存名字
     * key:缓存数据使用的key可以用他指定默认是方法参数的值 1-方法的返回值
     * 编写spel:#id;参数id的值 #a0 #p0 #root.args[0]
     * keyGenerator: key的生成器,可以指定key生成器组件的id
     * key/keyGenerator二选一使用
     * cacheManager指定缓存管理器;或者cacheResolver指定获取解析器
     * condition:指定符合条件才缓存#a0>1第一个参数大于1
     * unless:不符合条件才缓存
     * sync:异步模式
     * @param id
     * @return
     */
    //keyGenerator="myGenerator"和key2选1
    @Cacheable(cacheNames = "emp",key = "#root.methodName+'['+#id+']'",condition = "#a0>1")
    public Employee getEmp(Integer id){
        System.out.println("查询"+id+"号员工");
        Employee emp=employeeMapper.getEmpById(id);
        return emp;
    }

    /**
     * CachePut:即调用方法,又更新缓存数据
     * 修改了数据库某个数据同时更新缓存
     * 运行时机
     * 1.先调用目标方法,然后将结果缓存
     * 测试
     * 先查询1号员工
     */
    @CachePut(value = "emp",key="#result.id")
    public Employee updateEmp(Employee employee){
        employeeMapper.updateEmp(employee);
        return employee;
    }

    @CacheEvict(value = "emp",key = "#id") //缓存清除
    public void deleteEmp(Integer id){
        System.out.println("deleteEmp:"+id);
        employeeMapper.deleteEmpById(id);
    }
}
